placesview: Present FUSE-reachable network shares in Other Locations
authorColin Leroy <colin@colino.net>
Tue, 12 Sep 2017 13:32:36 +0000 (15:32 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 8 Dec 2017 02:41:44 +0000 (21:41 -0500)
The documentation about gtk_file_chooser_set_local_only() states
that "non-native files may still be available using the native
filesystem via a userspace filesystem (FUSE)."
The code that made this possible in GTK+2 was missing from GTK+3 and
that represented a regression for Linux users in numerous applications
(Firefox, Thunderbird, Chromium, ...)

https://bugzilla.gnome.org/show_bug.cgi?id=787128

gtk/gtkplacesview.c

index bb10b59b86dbfcf97c35ce549029e99f05e3ef0e..f8a2e22c6f462168cb03ac5bce3c859bd414984c 100644 (file)
@@ -1183,8 +1183,7 @@ update_places (GtkPlacesView *view)
   populate_servers (view);
 
   /* fetch networks and add them asynchronously */
-  if (!gtk_places_view_get_local_only (view))
-    fetch_networks (view);
+  fetch_networks (view);
 
   update_view_mode (view);
   /* Check whether we still are in a loading state */
@@ -1904,6 +1903,30 @@ on_listbox_row_activated (GtkPlacesView    *view,
   activate_row (view, row, priv->current_open_flags);
 }
 
+static gboolean
+is_mount_locally_accessible (GMount *mount)
+{
+  GFile *base_file;
+  gchar *path;
+
+  if (mount == NULL)
+    return FALSE;
+
+  base_file = g_mount_get_root (mount);
+
+  if (base_file == NULL)
+    return FALSE;
+
+  path = g_file_get_path (base_file);
+  g_object_unref (base_file);
+
+  if (path == NULL)
+    return FALSE;
+
+  g_free (path);
+  return TRUE;
+}
+
 static gboolean
 listbox_filter_func (GtkListBoxRow *row,
                      gpointer       user_data)
@@ -1911,6 +1934,7 @@ listbox_filter_func (GtkListBoxRow *row,
   GtkPlacesViewPrivate *priv;
   gboolean is_network;
   gboolean is_placeholder;
+  gboolean is_local = FALSE;
   gboolean retval;
   gboolean searching;
   gchar *name;
@@ -1923,7 +1947,20 @@ listbox_filter_func (GtkListBoxRow *row,
   is_network = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (row), "is-network"));
   is_placeholder = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (row), "is-placeholder"));
 
-  if (is_network && priv->local_only)
+  if (GTK_IS_PLACES_VIEW_ROW (row))
+    {
+      GtkPlacesViewRow *placesviewrow;
+      GMount *mount;
+
+      placesviewrow = GTK_PLACES_VIEW_ROW (row);
+      g_object_get(G_OBJECT (placesviewrow), "mount", &mount, NULL);
+
+      is_local = is_mount_locally_accessible (mount);
+
+      g_clear_object (&mount);
+    }
+
+  if (is_network && priv->local_only && !is_local)
     return FALSE;
 
   if (is_placeholder && searching)